数据绑定
在使用运行时数据绑定 API 之前,请先熟悉概述中介绍的核心概念。
视图模型
视图模型描述一组属性,但不能直接用于获取或设置值——这是视图模型实例的职责。
首 先,我们需要获取对特定视图模型的引用。可以通过索引、名称或给定画板的默认值从 Rive 文件中获取。默认选项指的是编辑器中下拉菜单为画板分配的视图模型。
从创建的 Rive 对象在 onLoad 回调中访问视图模型:
const r = new rive.Rive({
onLoad: () => {
// Rive 对象现在已加载并可以使用。
}
});
Rive 加载后,你可以使用以下方法访问视图模型:
// 按名称获取引用
const namedVM = r.viewModelByName("My View Model");
// 按索引获取引用
for (let i = 0; i < r.viewModelCount; i++) {
const indexedVM = r.viewModelByIndex(i);
}
// 获取默认视图模型的引用
const defaultVM = r.defaultViewModel();
或者,如果你可以访问底层的 RiveFile 对象,可以在文件上访问上述方法。
const file = new RiveFile(/** ... */);
await file.init();
const vmFromFile = file.viewModelByName("My View Model");
// 或通过其他方式从 RiveFile 底层实例获取 ViewModel
const fileInstance = file.getInstance();
const namedVM = fileInstance.viewModelByName("My View Model");
const indexedVM = fileInstance.viewModelByIndex(0);
const defaultVM = fileInstance.defaultArtboardViewModel(artboard);
视图模型实例
一旦我们有了视图模型的引用,就可以用它来创建实例。创建实例时有四个选项:
-
创建空白实例 —— 使用以下默认值填充创建的实例的属性:
类型 值 Number 0 String 空字符串 Boolean False Color 0xFF000000 Trigger 未触发 Enum 第一个值 Image 无图片 Artboard 无画板 List 空列表 嵌套视图模型 Null -
创建默认实例 —— 使用编辑器中标记为「Default」的实例。通常这是设计师打算在运行时使用的主要实例。
-
按索引创建 —— 使用迭代所有可用实例时返回的顺序。在通过迭代创建多个实例时很有用。
-
按名称创建 — — 使用编辑器中的实例名称。在创建特定实例时很有用。
在某些示例中,由于「view model instance」比较冗长,我们使用缩写「VMI」,以及「VM」代表「view model」。
// 从视图模型创建空白实例 (ViewModel)
const vmiBlank = viewModel.instance();
// 从视图模型创建默认实例 (ViewModel)
const vmiDefault = viewModel.defaultInstance();
// 从视图模型按索引创建实例 (ViewModel)
for (let i = 0; i < viewModel.instanceCount; i++) {
const vmiIndexed = viewModel.instanceByIndex(i);
}
// 从视图模型按名称创建实例 (ViewModel)
const vmiNamed = viewModel.instanceByName("My Instance");
绑定
然后可以将创建的实例分配给状态机或画板。这将建立在编辑时设置的绑定关系。
最好分配给状态机,因为这将自动将实例也应用于画板。仅在不使用状态机的情况下(即文件是静态的或使用线性动画)才分配给画板。
实例的初始值不会应用于其绑定元素,直到状态机或画板推进。
const r = new rive.Rive({
autoBind: false, // 应设置为 false(默认值)
onLoad: () => {
const vm = r.viewModelByName("My View Model");
const vmi = vm.instanceByName("My Instance");
// 通过将实例应用于状态机和画板来手动绑定
r.bindViewModelInstance(vmi);
}
});
bindViewModelInstance() 是一个便捷方法,它一步完成在状态机上设置视图模型实例并应用。要一次应用多个实例——例如主实例加上一个或多个全局视图模型——建议使用 set 方法逐个设置视图模型,然后用一次 bind() 统一应用:
r.setViewModelInstance(vmi); // 已设置,尚未应用
r.setGlobalViewModelInstance("Theme", themeVmi); // 已设置,尚未应用
r.bind(); // 一次重新绑定应用所有
bindViewModelInstance(vmi) 是 setViewModelInstance(vmi) 加 bind() 的简写。
先设置所有实例,再调用一次 bind()。 set 方法开销很小;bind() 的开销要大得多,每次按视图模型实例调用都会重复支付该开销。批量处理在初始化时最为重要,尤其是在有许多绑定或深层嵌套画板的图形上。
当状态机运行时,bind() 还会使用默认实例填充未设置的视图模型——画板的默认视图模型实例,以及文件中每个全局视图模型的默认实例。
自动绑定
或者,你可能会更倾向于使用自动绑定。这将自动使用默认实例将画板的默认视图模型绑定到状态机和画板。默认视图模型是在编辑器下拉菜单中为画板选择的视图模型。默认实例是编辑器中标记为「Default」的实例。
const r = new rive.Rive({
src: "my_rive_file.riv",
canvas: document.getElementById("canvas"),
autoBind: true,
onLoad: () => {
// 访问已自动绑定的当前实例
let boundInstance = r.viewModelInstance;
}
});